package gui.estudiante;

import entidad.CalificacionDetalle;
import gui.calificacion.DialogoCalificacionesPorEstudiante;
import gui.calificacion.PanelCalificacionesPorEstudiante;
import gui.curso.PanelCurso;

import java.awt.Font;

import java.awt.Rectangle;
import java.awt.SystemColor;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

import manejador.ManejadorDeCalificacionDetalle;
import modelo.ModeloCalificacionDetalle;
import utils.Utilidad;

import com.toedter.calendar.JCalendar;

import java.awt.event.KeyEvent;
import java.text.DateFormat;
import java.util.Date;

public class PanelModificarCalificacion extends JPanel {

	private static final long serialVersionUID = 1L;
	private JLabel lblFecha = null;
	private JTextField txtFecha = null;
	private JLabel lblDescripcion = null;
	private JLabel lblNotaCurso = null;
	private JTextArea txtDescripcion = null;
	private JTextField txtNotaCurso = null;
	private JButton btnEscogerFecha = null;
	private JPanel panelCalificacion = null;
	private Date fechaCalificacion = null;
	private Utilidad utilidad = null; // @jve:decl-index=0:
	private JLabel lblEstatus = null;
	private JRadioButton rbtnActivo = null;
	private JRadioButton rbtnInactivo = null;
	private JButton btnAceptar = null;
	private JButton btnCancelar = null;
	private ButtonGroup grupoBotonesEstatus = null; // @jve:decl-index=0:
	private ModeloCalificacionDetalle modeloCalificacionDetalle = null;
	private static PanelModificarCalificacion instancia = null;
	private static int idModificar = 0;
	private int puntosAcumulado = 0;
	private int idCalificacion = 0;

	public static PanelModificarCalificacion getInstancia() {
		if (instancia == null) {
			instancia = new PanelModificarCalificacion();
		}
		return instancia;
	}

	/**
	 * This is the default constructor
	 */
	private PanelModificarCalificacion() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {

		this.modeloCalificacionDetalle = ModeloCalificacionDetalle
				.getInstancia();
		this.grupoBotonesEstatus = new ButtonGroup();
		this.utilidad = Utilidad.getInstancia();
		lblNotaCurso = new JLabel();
		lblNotaCurso.setText("Nota Curso:");
		lblNotaCurso.setBounds(new Rectangle(14, 70, 82, 22));
		lblDescripcion = new JLabel();
		lblDescripcion.setText("Descripcion:");
		lblDescripcion.setBounds(new Rectangle(14, 109, 79, 22));
		lblFecha = new JLabel();
		lblFecha.setText("Fecha:");
		lblFecha.setBounds(new Rectangle(14, 34, 64, 22));
		this.setSize(389, 395);
		this.setLayout(null);
		this.add(getPanelCalificacion(), null);
		this.add(getBtnAceptar(), null);
		this.add(getBtnCancelar(), null);
		utilidad.formatearCampos(txtFecha, txtDescripcion, txtNotaCurso);
	}

	/**
	 * This method initializes txtFecha
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getTxtFecha() {
		if (txtFecha == null) {
			txtFecha = new JTextField();
			txtFecha.setBounds(new Rectangle(114, 34, 125, 22));
			txtFecha.setEnabled(false);
		}
		return txtFecha;
	}

	/**
	 * This method initializes txtDescripcion
	 * 
	 * @return javax.swing.JTextArea
	 */
	private JTextArea getTxtDescripcion() {
		if (txtDescripcion == null) {
			txtDescripcion = new JTextArea();
			txtDescripcion.setBounds(new Rectangle(114, 109, 222, 116));
		}
		return txtDescripcion;
	}

	/**
	 * This method initializes txtNotaCurso
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getTxtNotaCurso() {
		if (txtNotaCurso == null) {
			txtNotaCurso = new JTextField();
			txtNotaCurso.setBounds(new Rectangle(114, 68, 125, 22));
			txtNotaCurso.addKeyListener(new java.awt.event.KeyAdapter() {
				public void keyReleased(java.awt.event.KeyEvent e) {

					int puntuacion = txtNotaCurso.getText().trim().equals("") ? 0
							: Integer.parseInt(txtNotaCurso.getText()
									.toString());

					final int puntuacionTotal = 100;
					int puntosRestantes = 0;
					puntosRestantes = puntuacionTotal - puntosAcumulado;

					if (puntuacion > 100) {
						txtNotaCurso.setText("");
						JOptionPane
								.showMessageDialog(
										null,
										"La Nota es Acumulativa, no puede pasar de 100 puntos",
										"Atencion",
										JOptionPane.INFORMATION_MESSAGE);
					} else if (puntuacion > puntosRestantes) {
						txtNotaCurso.setText("");
						JOptionPane
								.showMessageDialog(
										null,
										"<html>Ha Excedido la acumulacion de puntos que es 100,<br>solo puede poner un puntaje igual o menor a "
												+ puntosRestantes + "</html>",
										"Atencion",
										JOptionPane.INFORMATION_MESSAGE);
					}
				}

				public void keyTyped(KeyEvent e) {
					char caracter = e.getKeyChar();
					if (((caracter < '0') || (caracter > '9'))
							&& (caracter != KeyEvent.VK_BACK_SPACE)) {
						e.consume();

					}

				}

			});

		}
		return txtNotaCurso;
	}

	/**
	 * This method initializes btnEscogerFecha
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getBtnEscogerFecha() {
		if (btnEscogerFecha == null) {
			btnEscogerFecha = new JButton();
			btnEscogerFecha.setText("fecha");
			btnEscogerFecha.setBounds(new Rectangle(244, 34, 71, 22));
			btnEscogerFecha
					.addActionListener(new java.awt.event.ActionListener() {
						@SuppressWarnings("deprecation")
						public void actionPerformed(java.awt.event.ActionEvent e) {
							@SuppressWarnings("unused")
							DateFormat formatoFecha = DateFormat
									.getDateInstance();
							Date fecha = seleccionarFechaCalificacion();
							fechaCalificacion = fecha;

							txtFecha
									.setText((fechaCalificacion.getYear() + 1900)
											+ "-"
											+ (fechaCalificacion.getMonth() + 1)
											+ "-" + fechaCalificacion.getDate());
						}
					});
		}
		return btnEscogerFecha;
	}

	private Date seleccionarFechaCalificacion() {
		JCalendar calendar = new JCalendar();
		JDialog dialogo = new JDialog();
		dialogo.setTitle("Elija Fecha de Termino del Ciclo");
		dialogo.setModal(true);
		dialogo.setContentPane(calendar);
		dialogo.setSize(300, 300);
		dialogo.setVisible(true);
		return (Date) calendar.getDate();

	}

	/**
	 * This method initializes panelCalificacion
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getPanelCalificacion() {
		if (panelCalificacion == null) {
			lblEstatus = new JLabel();
			lblEstatus.setBounds(new Rectangle(14, 243, 57, 22));
			lblEstatus.setText("Estatus:");
			panelCalificacion = new JPanel();
			panelCalificacion.setLayout(null);
			panelCalificacion.setBounds(new Rectangle(12, 14, 368, 328));
			panelCalificacion.setBorder(BorderFactory.createTitledBorder(
					BorderFactory.createLineBorder(SystemColor.controlText, 1),
					"Calificacion del Estudiante",
					TitledBorder.DEFAULT_JUSTIFICATION,
					TitledBorder.DEFAULT_POSITION, new Font("Dialog",
							Font.BOLD, 14), SystemColor.controlText));
			panelCalificacion.add(getTxtDescripcion(), null);
			panelCalificacion.add(lblDescripcion, null);
			panelCalificacion.add(getTxtNotaCurso(), null);
			panelCalificacion.add(lblNotaCurso, null);
			panelCalificacion.add(lblFecha, null);
			panelCalificacion.add(getTxtFecha(), null);
			panelCalificacion.add(getBtnEscogerFecha(), null);
			panelCalificacion.add(lblEstatus, null);
			panelCalificacion.add(getRbtnActivo(), null);
			panelCalificacion.add(getRbtnInactivo(), null);
		}
		return panelCalificacion;
	}

	/**
	 * This method initializes rbtnActivo
	 * 
	 * @return javax.swing.JRadioButton
	 */
	private JRadioButton getRbtnActivo() {
		if (rbtnActivo == null) {
			rbtnActivo = new JRadioButton();
			rbtnActivo.setBounds(new Rectangle(114, 243, 75, 22));
			rbtnActivo.setText("Activo");
			rbtnActivo.setSelected(true);
			grupoBotonesEstatus.add(rbtnActivo);
		}
		return rbtnActivo;
	}

	/**
	 * This method initializes rbtnInactivo
	 * 
	 * @return javax.swing.JRadioButton
	 */
	private JRadioButton getRbtnInactivo() {
		if (rbtnInactivo == null) {
			rbtnInactivo = new JRadioButton();
			rbtnInactivo.setBounds(new Rectangle(188, 244, 74, 22));
			rbtnInactivo.setText("Inactivo");
			grupoBotonesEstatus.add(rbtnInactivo);
		}
		return rbtnInactivo;
	}

	/**
	 * This method initializes btnAceptar
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getBtnAceptar() {
		if (btnAceptar == null) {
			btnAceptar = new JButton();
			btnAceptar.setBounds(new Rectangle(84, 354, 98, 30));
			btnAceptar.setText("Aceptar");
			btnAceptar.addActionListener(new java.awt.event.ActionListener() {

				@SuppressWarnings("deprecation")
				public void actionPerformed(java.awt.event.ActionEvent e) {

					if (utilidad
							.validar(txtNotaCurso, txtFecha, txtDescripcion) == false
							|| rbtnActivo.isSelected() == false
							&& rbtnInactivo.isSelected() == false) {

						JOptionPane.showMessageDialog(null,
								"Faltan Campos por Llenar", "Error",
								JOptionPane.ERROR_MESSAGE);
					} else {
						String estatus = rbtnActivo.isSelected() ? "ACTIVO"
								: "INACTIVO";

						java.sql.Date fecha = new java.sql.Date(
								fechaCalificacion.getYear() + 1900 - 1900,
								fechaCalificacion.getMonth(), fechaCalificacion
										.getDate());

						CalificacionDetalle calificacionDetalle = new CalificacionDetalle(
								0, txtDescripcion.getText(), Integer
										.parseInt(txtNotaCurso.getText()
												.toString()), fecha, estatus,
								getIdCalificacion());

						calificacionDetalle = (CalificacionDetalle) utilidad
								.convertirAMayuscula(calificacionDetalle);
						modeloCalificacionDetalle.modificarCalificacion(
								calificacionDetalle, getIdModificar());
						modeloCalificacionDetalle
								.cambiarEstatusCalificacionAActivo(
										PanelEstudiantesPorCurso
												.getIdEstudiante(), PanelCurso
												.getIdCurso());
						modeloCalificacionDetalle
								.actualizarTableParametros(ModeloCalificacionDetalle
										.getParametro());

						if (PanelCalificacionesPorEstudiante.getInstancia()
								.verficar() == false) {

							DialogoCalificacionesPorEstudiante dialogoCalificacionesPorEstudiante = DialogoCalificacionesPorEstudiante
									.getInstancia();
							dialogoCalificacionesPorEstudiante.sizeNormal();
							dialogoCalificacionesPorEstudiante = null;
						}
						JOptionPane
								.showMessageDialog(null,
										"Calificacion Modificada con exito",
										"Confirmacion",
										JOptionPane.INFORMATION_MESSAGE);

					}
				}
			});

		}
		return btnAceptar;
	}

	/**
	 * This method initializes btnCancelar
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getBtnCancelar() {
		if (btnCancelar == null) {
			btnCancelar = new JButton();
			btnCancelar.setBounds(new Rectangle(194, 354, 98, 30));
			btnCancelar.setText("Salir");
			btnCancelar.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					if (JOptionPane.showConfirmDialog(null,
							"Confirma que desea salir?", "Atencion",
							JOptionPane.OK_CANCEL_OPTION) == 0) {
						DialogoModificarCalificacion.getInstancia().setVisible(
								false);
					}
				}
			});
		}
		return btnCancelar;
	}

	public void llenarCampos() {

		CalificacionDetalle calificacionDetalle = (CalificacionDetalle) ManejadorDeCalificacionDetalle
				.getInstancia().getEntidadPorId(getIdModificar());

		// Aqui es donde hago la resta para la Logica de la Calificacion
		puntosAcumulado = (modeloCalificacionDetalle.getNotaCursoCompleto(
				PanelEstudiantesPorCurso.getIdEstudiante(), PanelCurso
						.getIdCurso()) - calificacionDetalle.getNotaAcumulada());

		System.out.println(puntosAcumulado + "puntoAcumulado");

		txtFecha.setText(String.valueOf(calificacionDetalle.getFecha()));
		txtDescripcion.setText(calificacionDetalle.getDescripcion());
		txtNotaCurso.setText(String.valueOf(calificacionDetalle
				.getNotaAcumulada()));
		setIdCalificacion(calificacionDetalle.getIdCalificacion());

		Date fecha = calificacionDetalle.getFecha();
		fechaCalificacion = fecha;

		if (calificacionDetalle.getEstatus().equalsIgnoreCase("ACTIVO")) {
			rbtnActivo.setSelected(true);
		} else {
			rbtnInactivo.setSelected(false);
		}

	}

	public static int getIdModificar() {
		return idModificar;
	}

	public static void setIdModificar(int idModificar) {
		PanelModificarCalificacion.idModificar = idModificar;
	}

	public int getIdCalificacion() {
		return idCalificacion;
	}

	public void setIdCalificacion(int idCalificacion) {
		this.idCalificacion = idCalificacion;
	}
} // @jve:decl-index=0:visual-constraint="10,10"
